<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 闭包的条件  


        //  1. 函数执行空间不会被销毁 
        //  2. 需要直接或者间接的返回一个函数 

        // 闭包 :
        // 一个函数 使用外部函数的私有变量 或者参数   
        // 即使这个外部函数 已经返回结束了  (条件就是 外部函数执行空间不会被销毁)


        function outer(){
            let n1 = 100;
            let n2 = 200;
            function inner(){
                return n1;
            }

            return inner
        }


        // 首先 inner() 是outer 函数的私有函数 

        // 全局范围内 不能直接调用  

        // n1 n2  是outer 的私有变量 
        //  全局范围内 不能直接使用n1  n2 


        // outer() // 结果是inner 函数  注意 没有() 这时候inner 不执行 
        // inner 加上() 才会执行

        // 如何让inner + () 
        // outer()  = inner
        // outer()() = inner()
        // console.log(outer()());


        // const res = outer(); 
        // // res   inner

        // console.log(res());

        

        // 应用场景  

        // 1. 如果想访问一个函数的私有变量 


        // function fn1(){
        //     let n6 = 666
        // }
        
        // console.log(n6);  // 报错 



        // function fn1(){
        //     let n6 = 666
        //     function fn2(){
        //         return n6  // 在内部函数中返回这个私有变量 
        //     }

        //     return fn2; // 外部函数 把内部函数 返回 
        // }



        // const res = fn1();

        // console.log(res());
        
        // function test2(){
        //     console.log('我是test2');
        // }
        // function test1(num){
        //     console.log('2秒以后我被执行了',num);
        // }
        // setInterval(test2,5000);
        // setInterval(function(){},1000)
        // setInterval("test2()",5000);


        // setInterval("test1(10)",2000); ok

        // setInterval(test1(10),5000); // 失效  立即执行了函数 
        // 如何让上面的写法起作用  
        // 闭包   

       


        // 闭包应用场景2 

        // 定时器 采用 setInterval(函数,时间); 函数不加"" 
        // 是不允许携带参数(如果函数加上"" 可以携带)
        // 如何在函数不加""情况下  能够携带参数 


        // 解决方案  就是闭包 
        function test1(num){
            return function(){
                console.log(num);
            }
        }

        var fn = test1(999);

        setInterval(fn,5000); 



    </script>
</body>
</html>